class {{classname}} {
  /// The underlying value of this enum member.
  final {{dataType}} value;

  const {{classname}}._internal(this.value);

  {{#allowableValues}}
    {{#enumVars}}
      {{#description}}
  /// {{description}}
      {{/description}}
  static const {{classname}} {{{name}}} = const {{classname}}._internal({{{value}}});
    {{/enumVars}}
  {{/allowableValues}}

  static {{classname}} fromJson(String value) {
    return new {{classname}}TypeTransformer().decode(value);
  }
}

class {{classname}}TypeTransformer {

  dynamic encode({{classname}} data) {
    return data.value;
  }

  {{classname}} decode(dynamic data) {
    switch (data) {
      {{#allowableValues}}
        {{#enumVars}}
      case {{{value}}}: return {{classname}}.{{{name}}};
        {{/enumVars}}
      {{/allowableValues}}
      default: throw('Unknown enum value to decode: $data');
    }
  }
}
